/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.controller;

import br.com.folha.dao.GenericoDao;
import br.com.folha.dao.PredioDao;
import br.com.folha.dao.UnidadeDao;
import br.com.folha.entity.Predio;
import br.com.folha.entity.Unidade;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

/**
 *
 * @author marceloml
 */
@ManagedBean(name="PredioController")
@ViewScoped
public class PredioController implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private Predio predio;
    private Predio predioSelecionado;
    private transient DataModel lista;
    private GenericoDao predioDao = new GenericoDao(); 
    private PredioDao consulta = new PredioDao();
    private UnidadeDao unidadeDao = new UnidadeDao();
    
    private Integer selectedUnidade;
    
    private String acao;
    private Unidade unidade;
    private Long retorno;
    private Date data = new Date();
    private boolean resultado;
    
    public PredioController(){
        
        predio = new Predio();
        acao = "";
        
    }
    
    
  public Collection<SelectItem> getCarregarUnidades() {        
      
        unidade = new Unidade();
        UnidadeDao unidadeDao = new UnidadeDao();
      
        Collection<SelectItem> lst = new ArrayList<SelectItem>();        
        lst.add(new SelectItem(null, "Selecione a unidade"));      //Primeiro item do select  
        
        List<Integer> integerArray = new ArrayList<Integer>();
        
        LoginController login = new LoginController();
        
        for (Iterator iterator = login.Usuario.getUnidades().iterator(); iterator.hasNext();){
            
            Unidade unidade = (Unidade) iterator.next();                     
            
            integerArray.add(unidade.getId());
        
        }        
        
        List<Unidade> lista = unidadeDao.listaUnidade(unidade,integerArray);
        
        for (int i = 0; i < lista.size(); i++) {          
            lst.add(new SelectItem(lista.get(i).getId(), lista.get(i).getNome()));              
        }          
        
        return lst;          
    }
  
    public void preparaInclusao(){  
        
        FacesMessage msg = null;   
        
        if(predio.getNome().equals("")){
            
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "É necessário informar o nome do Prédio!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                
        }else if(selectedUnidade == 0){

                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "É necessário informar a Unidade!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);            
            
        }else{
            
            if(!acao.equals("edicao")){
                
                retorno = consulta.consultaNome(predio.getNome());
                
                if(retorno != 0){
                    
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Já Existe um Prédio com esse nome!", "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);                     
                    
                }else{
                    
                    salvaOperacao();
                    
                }
                
            }else{
                
                editaOperacao();
                
            }
            
        }
        
    }
    
    public void salvaOperacao(){
        
        FacesMessage msg = null;   
        
        //Seta a data de Cadastro
        predio.setDt_cadastro(data);
        
        LoginController usuarioLogado = new LoginController();  
        
        predio.setUsuario_cadastro(usuarioLogado.getUsuario().getId());
        
        predio.setUnidade(unidadeDao.getById(selectedUnidade));
        
        resultado = predioDao.salvar(predio);
        
        if(resultado){
        
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Prédio cadastrado com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                        
        
            resetPredio();            
            
        }else{
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao cadastrar Prédio!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);             
            
        }
        
    }
    
    public void preparaEdicao(){
        
        predio = predioSelecionado;
        
        selectedUnidade = predioSelecionado.getUnidade().getId();
        
        acao = "edicao";
        
    }
    
    public void editaOperacao(){
        
        FacesMessage msg = null;   
        
          retorno = consulta.consultaNome(predio.getNome());
                                   
                    //Seta a data de Cadastro
                    predio.setDt_atualizacao(data);

                    LoginController usuarioLogado = new LoginController();  

                    predio.setUsuario_atualizacao(usuarioLogado.getUsuario().getId());

                    predio.setUnidade(unidadeDao.getById(selectedUnidade));

                    resultado = predioDao.atualizar(predio);

                    if(resultado){

                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Prédio atualizado com sucesso!", "");
                        FacesContext.getCurrentInstance().addMessage(null, msg);                        

                        resetPredio();      
                        
                        acao = "";

                    }else{

                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao atualizar Prédio!", "");
                        FacesContext.getCurrentInstance().addMessage(null, msg);             

                    }                    
                    
    }
    
    public void deletaPredio(){
        
        FacesMessage msg = null;   
        
        if(predioSelecionado == null){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Nenhum prédio selecionado!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                         
            
        }else{
            
            resultado = predioDao.excluir(predioSelecionado);
            
            if(resultado){
                
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Prédio excluído!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);      
                
                resetPredio();                                
                
            }else{
                
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao deletar prédio!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);                 
                
            }
            
        }
        
    }
    
    public void resetPredio(){
        
        predio = new Predio();
        selectedUnidade = 0;
        acao = "";
        lista = new ListDataModel(consulta.listaPredio(predio));
        
    }

    public Predio getPredio() {
        return predio;
    }

    public void setPredio(Predio predio) {
        this.predio = predio;
    }

    public Predio getPredioSelecionado() {
        return predioSelecionado;
    }

    public void setPredioSelecionado(Predio predioSelecionado) {
        this.predioSelecionado = predioSelecionado;
    }

    public DataModel getLista() {
        
        if(lista == null || lista.getRowCount() == 0){
                        
                    lista = new ListDataModel(consulta.listaPredio(predio));
        
        }
        
        return lista;          
        
    }

    /**
     * @return the selectedUnidade
     */
    public Integer getSelectedUnidade() {
        return selectedUnidade;
    }

    /**
     * @param selectedUnidade the selectedUnidade to set
     */
    public void setSelectedUnidade(Integer selectedUnidade) {
        this.selectedUnidade = selectedUnidade;
    }
    
}
